package 常用的10种算法.horse;

import java.awt.*;
import java.util.ArrayList;

public class HorseChessBoard {
    private static int X;//表示列数
    private static int Y;//表示行数
    private static boolean[] visited;//标记各个位置是否被访问过
    //使用一个属性标记是否期盼所有位置都被访问过了
    private static boolean finished;

    public static void main(String[] args) {


    }

    /**
     * 完成其实周游算法
     *
     * @param chessboard 棋盘
     * @param row        马的当前位置的行,从0开始
     * @param column     列
     * @param step       是第几步,初始位置是第一步
     */
    public static void traversalChessborad(int[][] chessboard, int row, int column, int step) {
        chessboard[row][column] = step;
        visited[row * X + column] = true;//该位置已经访问
        //获取当位置可以走的下一个位置的集合
        ArrayList<Point> ps = next(new Point(column, row));
        //遍历ps
        while (ps != null) {
            Point p = ps.remove(0);
            //判断该点是否已经访问过
            if (!visited[p.y * X + p.x]) {
                traversalChessborad(chessboard, p.y, p.x, step + 1);
            }
            //判断是否完成
            if (step < X * Y && !finished) {
                chessboard[row][column] = 0;
                visited[row * X + column] = false;
            } else {
                finished = true;
            }

        }


    }


    /**
     * 功能:根据当前的的位置,计算出所有能走的位置,并保存
     *
     * @param curPoint
     * @return
     */
    public static ArrayList<Point> next(Point curPoint) {
        ArrayList<Point> ps = new ArrayList<>();
        //创建一个Point
        Point p1 = new Point();
        if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y - 1) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走6这个位置
        if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y - 2) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走7这个位置
        if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y - 2) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走0这个位置
        if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y - 1) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走1这个位置
        if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y + 1) < Y) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走2这个位置
        if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y + 2) < Y) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走3这个位置
        if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < Y) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走4这个位置
        if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < Y) {
            ps.add(new Point(p1));
        }
        return ps;
    }
}
